/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Panaderia;

import Tipos.Buffer;
import static Tipos.TipoMensaje.*;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.logging.Level;
import java.util.logging.Logger;
import Tipos.Mensaje;
import Tipos.Stock;
import Tipos.TipoMensaje;
import Tipos.UbicacionPanaderia;

public class PanaderoProcesador extends Thread{
    private Buffer peticiones;
    private Stock stock;
    private UbicacionPanaderia direccionSucursal;
    private ObjectOutputStream outStreamCoordinador;
    private MulticastSocket socketUDP;
    private InetAddress grupo;
    private int puertoUDP;
    private boolean cerrar;

    public PanaderoProcesador(Buffer peticiones, Stock stock, UbicacionPanaderia direccionSucursal, ObjectOutputStream outStreamCoordinador, MulticastSocket socketUDP, InetAddress grupo, int puertoUDP) {
        this.peticiones = peticiones;
        this.stock = stock;
        this.direccionSucursal = direccionSucursal;
        this.outStreamCoordinador = outStreamCoordinador;
        this.socketUDP = socketUDP;
        this.grupo = grupo;
        this.puertoUDP = puertoUDP;
        this.cerrar = false;
    }
    
    /*
     * El panadero que procesa los mensajes del coordinador analiza el
     * tipo de mensaje; si el mensaje es de COMENZAR_PANADERIA comienza funcionar el negocio caso
     * contrario decide si va a relizar el comit de 2 fases.
     * 
     */
    @Override
    public void run() {
        //System.out.println("Soy el Panadero procesador...  :D");
        while(!cerrar || !peticiones.isEmpty()){ //modificar: borrar el !peticiones.isEmpty()
            if(peticiones.isEmpty()){
                //System.out.println("PanaderoProcesador---> buffer vacio");
            }else{
                Mensaje mensajeRecibido;
                Mensaje mensajeEnviar = new Mensaje();
                mensajeRecibido = peticiones.get(); 
                if (mensajeRecibido != null){
                    System.out.println("PanaderoProcesador---> " + mensajeRecibido.mostrarPantalla());
                    switch (mensajeRecibido.getMensajePanaderia()) {
                        case VOTE_REQUEST : 
                            boolean commit = stock.prestar(mensajeRecibido.getCantPanes());
                            if (commit){
                                mensajeEnviar.setMensajePanaderia(TipoMensaje.VOTE_COMMIT);
                            }else{
                                mensajeEnviar.setMensajePanaderia(TipoMensaje.VOTE_ABORT);
                            }
                            mensajeEnviar.setIdCommit(mensajeRecibido.getIdCommit());
                            mensajeEnviar.setCantPanes(mensajeRecibido.getCantPanes());
                            mensajeEnviar.setEmisor(direccionSucursal);
                            mensajeEnviar.setIniciador(mensajeRecibido.getIniciador());
                            mensajeEnviar.setParticipanteCommit(mensajeRecibido.getParticipanteCommit());
                            try {
                                outStreamCoordinador.writeObject(mensajeEnviar);
                                System.out.println("PanaderoProcesador---> " + mensajeEnviar.mostrarPantalla());
                            } catch (IOException ex) {
                                Logger.getLogger(PanaderoProcesador.class.getName()).log(Level.SEVERE, null, ex);
                            }
                            break;
                            
                        case GLOBAL_COMMIT:
                            stock.confirmarPrestamo();
                            break;
                            
                        case GLOBAL_ABORT:
                            stock.deshacerPrestamo();
                            break;
                            
                        case PEDIDO_PANES:
                            mensajeEnviar.setMensajePanaderia(RESPUESTA_PEDIDO);
                            mensajeEnviar.setCantPanes(stock.getStock());
                            mensajeEnviar.setEmisor(direccionSucursal);
                            mensajeEnviar.setIniciador(mensajeRecibido.getIniciador());
                            mensajeEnviar.setParticipanteCommit(mensajeRecibido.getParticipanteCommit());
                            DatagramPacket paquete = new DatagramPacket(mensajeEnviar.toString().getBytes(), mensajeEnviar.toString().length(), grupo, puertoUDP);
                            try {
                                socketUDP.send(paquete);
                            } catch (IOException ex) {
                                Logger.getLogger(PanaderoProcesador.class.getName()).log(Level.SEVERE, null, ex);
                            }
                            break;
                            
                        case COMENZAR_PANADERIA:
                            //System.out.println("PanaderoProcesador--------------------> direccion Sucursal: " + direccionSucursal);
                            //System.out.println("PanaderoProcesador---> llamando stock.comenzar() ");
                            stock.comenzar();
                            break;
                            
                        case PANADERIA_CERRADA:
                            cerrar(true) ;
                            break;
                    }
                }else
                    System.out.println("PanaderoProcesador--->  mensaje null ");
     
            }
        }
        //System.out.println("cierro procesador");
  }

    void cerrar(boolean cerrar) {
        this.cerrar = cerrar;
    }
}
